package com.niodata.dp.core.usermgr.op;

import com.niodata.dp.core.usermgr.DpUsermgrException;
import com.niodata.dp.core.usermgr.enums.SystemRole;
import com.niodata.dp.core.usermgr.model.UserInfo;
import com.niodata.dp.core.usermgr.model.result.UserResult;
import java.util.List;

/**
 * 用户相关接口.
 */
public interface UserService {

  /**
   * 创建用户.
   *
   * @param userInfo 用户信息
   * @throws DpUsermgrException 用户管理模块异常
   */
  void createUser(UserInfo userInfo) throws DpUsermgrException;

  /**
   * 根据用户ID删除用户.
   *
   * @param userId 用户ID
   * @throws DpUsermgrException 用户管理模块异常
   */
  void removeUser(Long userId) throws DpUsermgrException;

  /**
   * 根据用户ID更改用户角色.
   *
   * @param userId 用户ID
   * @param systemRole 用户角色
   * @throws DpUsermgrException 用户管理模块异常
   */
  void modifyUserRole(Long userId, SystemRole systemRole) throws DpUsermgrException;

  /**
   * 根据用户ID更改用户基本信息.
   *
   * @param userId 用户ID
   * @param email 邮箱
   * @param password 密码
   * @param detail 备注
   * @throws DpUsermgrException 用户管理模块异常
   */
  void modifyUserInfo(Long userId, String email, String password, String detail)
        throws DpUsermgrException;

  /**
   * 根据用户ID获取用户信息.
   *
   * @param userId 用户ID
   * @return UserInfo 用户实体
   * @throws DpUsermgrException 用户管理模块异常
   */
  UserInfo getUserInfo(Long userId) throws DpUsermgrException;

  /**
   * 根据用户名获取用户信息.
   *
   * @param loginName 用户名
   * @return UserInfo 用户实体
   * @throws DpUsermgrException 用户管理模块异常
   */
  UserInfo getUserInfo(String loginName) throws DpUsermgrException;

  /**
   * 根据组ID获取组内所有用户信息.
   *
   * @param groupId 组ID
   * @return 用户列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<UserInfo> getGroupUsers(Long groupId) throws DpUsermgrException;

  /**
   * 获取所有用户(userIds除外).
   *
   * @param userIds 去除在外的userIds
   * @return 用户列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<UserInfo> getAllUsersExcept(Long... userIds) throws DpUsermgrException;

  /**
   * 根据用户角色返回能查看的用户数量.
   *
   * @param role 角色
   * @return 用户数量
   * @throws DpUsermgrException 用户管理模块异常
   */
  int getAllUsersByCurrentUserRoleCount(SystemRole role)
        throws DpUsermgrException;

  /**
   * 根据用户角色返回能查看的所有用户信息.
   *
   * @param role 角色
   * @param pageIndex 第几页
   * @param pageSize 每页多少条
   * @return 用户列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<UserResult> getAllUsersByCurrentUserRole(SystemRole role, int pageIndex, int pageSize)
        throws DpUsermgrException;

  /**
   * 获取组Master信息.
   *
   * @param groupId 组ID
   * @return Master信息
   */
  UserInfo getGroupMaster(Long groupId);

  /**
   * 根据用户名获取HDFS Keytab.
   *
   * @param userName 用户ID
   * @return 字节数组
   * @throws DpUsermgrException 用户管理模块异常
   */
  byte[] getUserKeytab(String userName) throws DpUsermgrException;

  /**
   * 根据组ID获取内置Master的Keytab.
   *
   * @param groupName group name
   * @return 字节数组
   * @throws DpUsermgrException 用户管理模块异常
   */
  byte[] getMasterKeytab(String groupName) throws DpUsermgrException;

  /**
   * 查看此用户是否在任何组中为Owner(删除用户时校验).
   *
   * @param userId 用户ID
   * @return 是、否
   * @throws DpUsermgrException 用户管理模块异常
   */
  boolean checkIsOwnerAnyGroup(Long userId) throws DpUsermgrException;

  List<UserInfo> searchUserByName(String nameKeyWord);

}
